
#ifndef __APPPARAM_E50COMDATA_H__
#define __APPPARAM_E50COMDATA_H__

// E50的协议比较特殊，是通用协议出来之前的自定义协议，作者为鲁观龙(已离职)
// 显示板<->电源板 通讯协议的最近修改日期为 20210923，xlsx文件无版本号
// 头部板<->电源板 通讯协议的最近修改日期未知，xlsx文件的版本号为0.7

#pragma pack(1)
// 设备编号
typedef enum
{
    MACHINECODE_NULL = 0,
    MACHINECODE_STERILIZER = 1, // 1 消毒柜
    MACHINECODE_STEAMER = 2,    // 2 蒸箱
    MACHINECODE_STEAM_OVEN = 3, // 3 蒸烤箱
} MACHINECODE;

// 命令通用帧头
typedef struct
{
    unsigned char head1;      // 帧头1
    unsigned char head2;      // 帧头2
    unsigned char framelenth; // 帧头1~CRC校验
    MACHINECODE code;         // 设备编号 固定 0x03
} FRAMEHEAD;
// 命令通用帧尾
typedef struct
{
    unsigned char version; // 软件版本号
    unsigned short crc;    // crc校验 crc16_modbus
} FRAMETAIL;

// 整机工作场景
typedef enum
{
    MACHINEENV_NULL = 0,
    MACHINEENV_POWERON = 1,  // 1 上电状态
    MACHINEENV_PAUSE = 6,    // 6 暂停状态
    MACHINEENV_IDLE = 2,     // 2 待机状态(包括关机、风机延时)
    MACHINEENV_CFG = 3,      // 3 设置状态
    MACHINEENV_ERR = 7,      // 7 错误指示状态（报警处理）
    MACHINEENV_BOOKING = 4,  // 4 预约状态（时间设置、预约等待）
    MACHINEENV_WORKING = 5,  // 5 工作状态
    MACHINEENV_DIAGNOSE = 8, // 8 自检测试状态
} MACHINEENV;

// 烟机状态命令
// 交流电机：0 停止 1低速 2中速 3高速
typedef enum
{
    ACMOTOR_LEVEL_STOP = 0,
    ACMOTOR_LEVEL_LOW = 1,
    ACMOTOR_LEVEL_MID = 2,
    ACMOTOR_LEVEL_HIGH = 3
} ACMOTOR_LEVELS;

typedef union
{
    ACMOTOR_LEVELS acmotorlevel;
    unsigned char dcmotorspeed; // 无刷直流电机： 0-127
} FANCMD;
// 灶头工作状态 0不工作（关火后） 1点火状态（5S左右）  2 工作状态
typedef enum
{
    STOVESTATUS_IDLE = 0,
    STOVESTATUS_FIREON = 1,
    STOVESTATUS_WORKING = 2
} STOVESTATUS;
// 基本蒸烤模式
typedef enum
{
    MODE_NULL = 0,                   // 0：无  ，，，，，，，，，，，，，，， ，
    MODE_CLASSICSTEAM = 1,           // 1：经典蒸
    MODE_QUICKSTEAM = 2,             // 2：快速蒸
    MODE_FAN = 3,                    // 3：风扇烤
    MODE_STRONG = 4,                 // 4：强烧烤
    MODE_HEATFAN = 5,                // 5：热风烧烤
    MODE_UPDOWNHEAT = 6,             // 6：上下加热
    MODE_HEATFAN2 = 7,               // 7：热风烤
    MODE_3DHEATFAN = 8,              // 8：立体热风
    MODE_FRESH = 9,                  // 9：嫩烤
    MODE_UNFREEZE = 10,              // 10：解冻
    MODE_DISINFECT = 11,             // 11：杀菌
    MODE_HEATPRESERVATE = 12,        // 12：保温
    MODE_FERMENT = 13,               // 13：发酵
    MODE_DRY = 14,                   // 14：烘干
    MODE_DESCAL = 15,                // 15：除垢
    MODE_DISINFECTER_DISINFECT = 16, // 16:消毒（消毒柜）
    MODE_DISINFECTER_DRY = 17,       // 17：烘干（消毒柜）
} MODE;
// 蜂鸣
typedef union
{
    struct
    {
        unsigned sn : 4;   // 高4位为流水号（每次发送时值+1）
        unsigned mode : 4; // 低4位为蜂鸣类型：0 蜂鸣清除，1 普通按键，2 开机，3 烘烤完成，4关机 ，5 报警 ， 6 。。
    } bits;
    unsigned char byte;
} BEEPCON;

// 继电器命令
typedef union
{
    struct
    {
        unsigned boxlight : 1;      // 腔体照明
        unsigned cyclefan : 1;      // 循环风机
        unsigned bottomheat : 1;    // 底部烧烤
        unsigned sideheat : 1;      // 侧面烧烤
        unsigned upheatin : 1;      // 顶部烧烤内
        unsigned upheatout : 1;     // 顶部烧烤外
        unsigned steampaltein : 1;  // 蒸发盘内
        unsigned steamplateout : 1; // 蒸发盘外
        unsigned ret : 4;           //
        unsigned headlight : 1;     // 头部照明
        unsigned hoodl : 1;         // 烟机L
        unsigned hoodm : 1;         // 烟机M
        unsigned hoodh : 1;         // 烟机H
    } bits;
    unsigned char bytes[2];
    unsigned short word;
} RELAY_CON;

// 控制命令
typedef union
{
    struct
    {
        unsigned ret1 : 1;
        unsigned tempswitch : 1;
        unsigned fanbanmotor : 2; // 00 stop 01direct 11reserver
        unsigned moodlight : 1;
        unsigned boxlight : 1;
        unsigned lock : 1;
        unsigned headlight : 1;
        unsigned ret2 : 1;
        unsigned autoboxout : 1;
        unsigned pump : 2; // 00 stop 01waterin 11waterout
        unsigned qmpower : 1;
        unsigned waterboxvalve : 1;
        unsigned leftstoveflameout : 1;
        unsigned rightstoveflameout : 1;
    } bits;
    unsigned char bytes[2];
    unsigned short word;
} CMDCON;
// 报警类型
typedef union
{
    struct
    {
        unsigned ret : 2;
        unsigned flamoutfailed : 1;
        unsigned accidentflameout : 1;
        unsigned comerr : 1;
        unsigned gasleak : 1;
        unsigned firewallfire : 1;
        unsigned firewallerr : 1;
    } bits;
    unsigned char byte;
} ALARMBITS;

typedef union
{
    struct
    {
        unsigned en : 1;
        unsigned ret1 : 2;
        unsigned hour : 4;
        unsigned min : 8;
        unsigned sec : 8;
    } bits;
    unsigned char byte;
} TM_TIME_CLB;

typedef union
{
    struct
    {

        unsigned poweron : 1;
        unsigned light : 1;
        unsigned ret : 4;
        unsigned lightdemo : 1;
        unsigned manufactor : 1;
    } bits;
    unsigned char byte;
} STOVECON;

typedef union
{
    struct
    {
        unsigned enable : 1;
        unsigned ret : 2;
        unsigned fanlevel : 5;
    } bits;
    unsigned char byte;
} LIGHTFANDISP;
typedef union
{
    struct
    {
        unsigned enable : 1;
        unsigned ret : 2;
        unsigned speaklevel : 5;
    } bits;
    unsigned char byte;
} LIGHTSPEAKISP;
typedef union
{
    struct
    {
        unsigned rightfireonsig : 1;
        unsigned err : 7;
    } bits;
    unsigned char byte;
} ERRCODE;
typedef union
{
    struct
    {
        unsigned ret : 6;
        unsigned close : 1;
        unsigned enable : 1;
    } bits;
    unsigned char byte;
} APPRIGHTSTOVEENABLE;

// 电源板>头部板的bytes[4,12]和显示板>电源板的bytes[15,23]具有相同的数据结构
typedef struct
{
    TM_TIME_CLB timeclb;                     // 天猫时间校准
    STOVECON stovecon;                       // 灶头工作状态
    LIGHTFANDISP lightfandisp;               // 灯条风速显示
    LIGHTSPEAKISP lightspeakdisp;            // 灯条语音显示
    ERRCODE errcode;                         // 故障报警代码
    APPRIGHTSTOVEENABLE apprightstoveenable; // app右灶定时使能
    unsigned char apprightstovetimer;        // app右灶定时时间
    unsigned char ret[3];                    // 预留
} POWER2HEAD_BODY;
typedef struct
{
    MACHINEENV machineenv;                   // 整机工作场景 填充 0xff
    FANCMD fancmd;                           // 烟机状态命令 填充
    STOVESTATUS stovestatus;                 // 灶头工作状态 填充
    MODE mode;                               // 基本蒸烤模式 填充
    unsigned char temperature;               // 蒸烤模式设定温度 填充
    BEEPCON beep;                            // 蜂鸣
    RELAY_CON relaycon;                      // 继电器控制
    CMDCON cmdcon;                           // 控制命令
    ALARMBITS alarmbits;                     // 报警类型
    TM_TIME_CLB timeclb;                     // 天猫时间校准
    STOVECON stovecon;                       // 灶头工作状态
    LIGHTFANDISP lightfandisp;               // 灯条风速显示
    LIGHTSPEAKISP lightspeakdisp;            // 灯条语音显示
    ERRCODE errcode;                         // 故障报警代码
    APPRIGHTSTOVEENABLE apprightstoveenable; // app右灶定时使能
    unsigned char apprightstovetimer;        // app右灶定时时间
} DISP2POWER_BODY;

typedef struct
{
    unsigned comerr : 1;
    unsigned indctioncookerflag : 1; // 电磁炉联动信号 0无1有
    unsigned rightstoveflag : 1;     // 右灶联动信号 0无1有
    unsigned leftstoveflag : 1;      // 左灶联动信号 0无1有
    unsigned waterboxmotorflag : 1;  // 水箱电机位置 0推出1到位
    unsigned waterboxflag : 1;       // 水箱位置 0推出1到位
    unsigned waterlevelflag : 1;     // 水位信号 0水箱无水1水箱有水
    unsigned doorflag : 1;           // 门信号 0关门1开门
    unsigned firewallleftsensor : 2; // 防火墙左传感器
    unsigned bottomboxsensor : 2;    // 下腔体传感器
    unsigned upboxsensor : 2;        // 上腔体传感器
    unsigned steamplatesensor : 2;   // 蒸发盘传感器状态
    unsigned ret : 4;
    unsigned waterpump : 2;           // 水泵状态
    unsigned firewallrightsensor : 2; // 防火墙右传感器
    unsigned ret : 8;
} MACHINEINFO;
typedef struct
{
    unsigned ret : 4;
    unsigned value : 12; // 12位AD
} AD12BIT;
typedef unsigned char AD8BIT;

typedef struct
{
    unsigned switcher : 1; // 切换开关，1 切换  0  未切换 （程序中未做）
    unsigned ret : 3;
    unsigned value : 12; // 12位AD
} BOXAD;

typedef struct
{
    MACHINEINFO machineinfo;
    AD12BIT steamplatead;               // 蒸发盘传感器
    BOXAD boxad;                        // 腔体传感器
    AD12BIT firewallleftad;             // 防火墙左传感器
    AD12BIT firewallrightad;            // 防火墙右传感器
    AD8BIT steamplatead;                // 气敏传感器
    AD8BIT stoveleftad;                 // 左灶头传感器
    AD8BIT stoverightad;                // 右灶头传感器
    WAVEHANDSTATUS head_wavehandstatus; // 手势挥手状态
    unsigned char head_hour;            // 头部 时间小时
    unsigned char head_minute;          // 头部 时间分钟
    unsigned char head_timer_retmin;    // 头部 灶具定时运行剩余时间 0-180分钟
    unsigned char head_timer_min;       // 头部 灶具定时
    HEAD_WORKSTATUS head_workstatus;    // 头部 工作状态
} POWER2DISP_BODY;

typedef struct
{
    unsigned beepreserve : 1;      // bit7:按键音电平反转
    unsigned light : 1;            // bit6:灯光(联动开机)
    unsigned timerendflag : 1;     // bit5:倒计时结束标志(电平反转)
    unsigned timercfgstatus : 1;   // bit4:定时设置状态
    unsigned stdtimecfgstatus : 1; // bit3:北京时间设置状态
    unsigned comerr : 1;           // bit2:通信故障
    unsigned ret : 2;
} HEAD_WORKSTATUS;
typedef struct
{
    unsigned rightreserve : 1; // 右挥手电平反转
    unsigned leftreserve : 1;  // 左挥手电平反转
    unsigned ret : 6;
} WAVEHANDSTATUS;

typedef struct
{
    unsigned char hour;            // 时间小时
    unsigned char minute;          // 时间分钟
    unsigned char timer_min;       // 灶具定时
    HEAD_WORKSTATUS workstatus;    // 工作状态
    WAVEHANDSTATUS wavehandstatus; // 手势挥手状态
    unsigned char timer_retmin;    // 灶具定时运行剩余时间 0-180分钟
    unsigned char ret[3];          // 预留
} HEAD2POWER_BODY;

typedef struct DISP2POWER
{
    FRAMEHEAD framehead; // 命令通用帧头
    DISP2POWER_BODY body;
    FRAMETAIL frametail;
} DISP2POWER;
typedef struct POWER2DISP
{
    FRAMEHEAD framehead; // 命令通用帧头
    POWER2DISP_BODY body;
    FRAMETAIL frametail;
} POWER2DISP;
typedef struct
{
    FRAMEHEAD framehead; // 命令通用帧头
    HEAD2POWER_BODY body;
    FRAMETAIL frametail;
} HEAD2POWER;
typedef struct
{
    FRAMEHEAD framehead; // 命令通用帧头
    POWER2HEAD_BODY body;
    FRAMETAIL frametail;
} POWER2HEAD;

#pragma pack()
#endif
